package com.ingenieria.industrial.controller;

import com.cerd.util.BaseSP01.JUtilBaseSP01;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;

public class BaseController extends JUtilBaseSP01 {

    protected HttpSession getSession(SpringParam sp) {
        return sp.request.getSession();
    }

    protected HttpSession getSession(SpringParam sp, boolean create) {
        return sp.request.getSession(create);
    }

    protected HttpServletRequest getRequest(SpringParam sp) {
        return sp.request;
    }

    protected HttpServletResponse getResponse(SpringParam sp) {
        return sp.response;
    }

    protected void setAttribute(SpringParam sp, String name, Object value) {
        getSession(sp).setAttribute(name, value);
    }

    protected Object getAttribute(SpringParam sp, String name) {
        return getSession(sp).getAttribute(name);
    }

    protected String getAttributeString(SpringParam sp, String name) {
        return (String) getAttribute(sp, name);
    }

    protected String getParameter(SpringParam sp, String nombre) {
        return convBlanco(sp.request.getParameter(nombre));
    }

    protected String getParameterUpper(SpringParam sp, String nombre) {
        return convMayus(getParameter(sp, nombre));
    }

    protected String getParameterLower(SpringParam sp, String nombre) {
        return convMinus(getParameter(sp, nombre));
    }

    protected void setAttributeRequest(SpringParam sp, String nombre, Object valor) {
        getRequest(sp).setAttribute(nombre, valor);
    }

    protected Object getRegistro(SpringParam sp) {
        return getAttribute(sp, "registro");
    }

    protected void setMensaje(SpringParam sp, Object valor) {
        setAttribute(sp, "mensaje", valor);
    }

    protected String getMensaje(SpringParam sp) {
        return convBlanco(getAttributeString(sp, "mensaje"));
    }

    protected void setLista(SpringParam sp, List lista) {
        setAttribute(sp, "lista", lista);
    }

    protected void setLista(SpringParam sp, String nombreLista, List lista) {
        setAttribute(sp, nombreLista, lista);
    }

    protected List getLista(SpringParam sp) {
        return (List) getAttribute(sp, "lista");
    }

    protected List getLista(SpringParam sp, String nombreLista) {
        return (List) getAttribute(sp, nombreLista);
    }

//    protected void setUsuario(SpringParam sp, User usuario) {
//        setAttribute(sp, "sUSER", usuario);
//    }
//    protected User getUsuario(SpringParam sp) {
//        return (User) getAttribute(sp, "sUSER");
//    }
    // TRABAJAR CON COMBOS
//    protected ComboWeb getCombo(SpringParam sp, String nombre) throws Exception {
//        if (_vacio(nombre)) {
//            throw new BaseException("BC-010", "Nombre de Combo vacío.");
//        }
//        ComboWeb cbo = (ComboWeb) getSession(sp).getAttribute(nombre);
//        if (cbo == null) {
//            throw new BaseException("BC-011", "Combo " + nombre + " no se encuentra en sesión.");
//        }
//        return cbo;
//    }
//    protected void setCombo(SpringParam sp, String nombre, ComboWeb combo) throws Exception {
//        if (_vacio(nombre)) {
//            throw new BaseException("BC-012", "Nombre de Combo vacío.");
//        }
//        if (combo == null) {
//            throw new BaseException("BC-013", "Combo " + nombre + " es nulo.");
//        }
//        setAttribute(sp, nombre, combo);
//    }
//
//    protected void setComboEstado(SpringParam sp) throws Exception {
//        ComboWeb cboEstado = new ComboWeb();
//        cboEstado.addItem("A", "ACTIVO");
//        cboEstado.addItem("I", "INACTIVO");
//        setAttribute(sp, "cboEstado", cboEstado);
//    }
//
//    protected void setComboEstadoTodos(SpringParam sp) throws Exception {
//        ComboWeb cboEstado = new ComboWeb();
//        cboEstado.addItem("", "TODOS");
//        cboEstado.addItem("A", "ACTIVO");
//        cboEstado.addItem("I", "INACTIVO");
//        setAttribute(sp, "cboEstadoTodos", cboEstado);
//    }
//
//    protected void setComboVisado(SpringParam sp) throws Exception {
//        ComboWeb cboVisado = new ComboWeb();
//        cboVisado.addItem("V", "VISADO");
//        cboVisado.addItem("O", "OBSERVADO");
//        setAttribute(sp, "cboVisado", cboVisado);
//    }
//
//    protected void setComboVisadoTodos(SpringParam sp) throws Exception {
//        ComboWeb cboVisado = new ComboWeb();
//        cboVisado.addItem("", "TODOS");
//        cboVisado.addItem("P", "PENDIENTES");
//        cboVisado.addItem("V", "VISADOS");
//        cboVisado.addItem("O", "OBSERVADOS");
//        setAttribute(sp, "cboVisadoTodos", cboVisado);
//    }
//
//    protected void setComboSN(SpringParam sp) throws Exception {
//        ComboWeb cboSN = new ComboWeb();
//        cboSN.addItem("N", "NO");
//        cboSN.addItem("S", "SI");
//        setAttribute(sp, "cboSN", cboSN);
//    }
//
//    protected void setComboTipoReporte(SpringParam sp) throws Exception {
//        ComboWeb cboTipoReporte = new ComboWeb();
//        cboTipoReporte.addItem("R", "RESUMIDO");
//        cboTipoReporte.addItem("D", "DETALLADO");
//        setAttribute(sp, "cboTipoReporte", cboTipoReporte);
//    }
//
//    protected void setComboMes(SpringParam sp) throws Exception {
//        setComboMes(sp, 1, 12);
//    }
//
//    protected void setComboMes(SpringParam sp, int mesIni, int mesFin) throws Exception {
//        ComboWeb cboMes;
//        for (cboMes = new ComboWeb(); mesIni <= mesFin; cboMes.addItem(toString(mesIni), DateTime.getNombreMes(mesIni++))) {
//        }
//        setCombo(sp, "cboMes", cboMes);
//    }
//
//    protected void setComboAnio(SpringParam sp, int anioIni, int anioFin) throws Exception {
//        ComboWeb cboAnio;
//        for (cboAnio = new ComboWeb(); anioIni <= anioFin; cboAnio.addItem(toString(anioIni), toString(anioIni++))) {
//        }
//        setCombo(sp, "cboAnio", cboAnio);
//    }
    protected void setAccion(SpringParam sp, String accion) {
        setAttribute(sp, "accion", accion);
    }

    protected void setReportXls(SpringParam sp) {
        setAttribute(sp, "report_xls", "S");
    }

    protected void setReportTXT(SpringParam sp) {
        setAttribute(sp, "report_txt", "S");
    }

    protected void setReportWord(SpringParam sp) {
        setAttribute(sp, "report_word", "S");
    }

    protected void setReportPDF(SpringParam sp) {
        setAttribute(sp, "report_pdf", "S");
    }

    protected void setReportGraphic(SpringParam sp) {
        setAttribute(sp, "report_graphic", "S");
    }

    protected String getIPString(SpringParam sp) {
        String ipPrivado = getRequest(sp).getHeader("X-Forwarded-For");
        if (isVacio(ipPrivado)) {
            ipPrivado = getRequest(sp).getRemoteHost();
        }

        return convBlanco(getRequest(sp).getRemoteAddr()) + " / " + convBlanco(ipPrivado);
    }

    protected final ModelAndView irController(String controller) {
        return new ModelAndView("redirect:" + controller);
    }

    // METODOS PARA RECOGER EL OBJETO SESSION Y EL REQUEST
    protected void removerDeSession(SpringParam sp, String... atributos) {
        for (String item : atributos) {
            setAttribute(sp, item, null);
        }
    }

    protected void removerDeSession(SpringParam sp, String atributo) {
        setAttribute(sp, atributo, null);
    }

    protected void setRegistro(SpringParam sp, Object registro) {
        setAttribute(sp, "registro", registro);
    }

    protected void setRegistroRequest(SpringParam sp, Object registro) {
        setAttributeRequest(sp, "registro", registro);
    }
//
//    protected void exportarReporteXLS(SpringParam sp, String nombreArchivo, HSSFWorkbook excelWriter) throws Exception {
//        try {
//            if (excelWriter == null) {
//                throw new BaseException("BC-123", "Libro Excel es Nulo.</br> ");
//            }
//            sp.response.setHeader("Content-Disposition", "attachment; filename=" + nombreArchivo);
//            sp.response.setContentType("text/csv");   // para excel y calc
//
//            OutputStream salida = sp.response.getOutputStream();
//            excelWriter.write(salida);
//            salida.close();
//        } catch (Exception sos) {
//            // no se cierra el flujo, porque al lanzar esta Excepción, todavia reenvia a la pagina de error y el flujo no debe estar cerrado.
//            throw new BaseException("BC-103", "No se pudo generar reporte.</br> " + sos.getMessage());
//        }
//
//    }
}
